package co.gov.medellin.ssti.sub.web.action;

import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.springframework.beans.factory.annotation.Autowired;

import co.gov.medellin.ssti.sub.common.excepcion.SUBException;
import co.gov.medellin.ssti.sub.common.util.Utility;
import co.gov.medellin.ssti.sub.model.service.CargueService;
import co.gov.medellin.ssti.sub.model.vo.CargueVO;
import co.gov.medellin.ssti.sub.paoyer.administration.exception.AdministrationUserException;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;
import co.gov.medellin.ssti.sub.paoyer.administration.util.AccessControl;
import co.gov.medellin.ssti.sub.paoyer.common.exception.CommonUserException;
import co.gov.medellin.ssti.sub.paoyer.common.exception.UserException;
import co.gov.medellin.ssti.sub.web.form.InformacionCargueForm;

public class InformacionCargueEmpresaAction extends Action {
	private static final String SIN_REGISTROS = "No se encontraron registros..";
	@Autowired
	CargueService cargueServiceImpl;

	/**
	 * This is the main action called from the Struts framework.
	 * 
	 * @param mapping
	 *            The ActionMapping used to select this instance.
	 * @param form
	 *            The optional ActionForm bean for this request.
	 * @param request
	 *            The HTTP Request we are processing.
	 * @param response
	 *            The HTTP Response we are processing.
	 * @return
	 * @throws java.io.IOException
	 * @throws javax.servlet.ServletException
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		ActionMessages messages = new ActionMessages();
		InformacionCargueForm formBean = (InformacionCargueForm) form;
		try {
			AccessControl access = new AccessControl();
			access.validateAccess(mapping, request, response);

			CargueVO objcargueVO = new CargueVO();
			String nombreCargue = formBean.getNombreCargue();
			String lote = formBean.getLote();
			// String busco = request.getParameter("busco");
			String operacion = formBean.getOperacion();

			String fechaInicial = formBean.getFechaInicial();
			String fechaFinal = formBean.getFechaFinal();

			// request.removeAttribute("cargue");
			// String search = request.getParameter("search");
			// if (search == null) {
			// search = (String) request.getAttribute("search");
			// }

			// if (lote == null) {
			// lote = (String) request.getAttribute("lote");
			// search = "ok";
			// }
			HttpSession session = request.getSession();

			String ingreso = request.getParameter("ingreso");

			Collection<CargueVO> cargue = null;
			// Para la auditoria de registros
			UserVO user = (UserVO) session.getAttribute("userInfo");
			String terminalAddress = "WEB=" + request.getRemoteAddr();
			if ((Object) ingreso != null) {
				if (ingreso.equals("true")) {
					objcargueVO.setCode(formBean.getLote());

					try {
						cargue = cargueServiceImpl
								.findArchivoCargueByCriteria(objcargueVO);
						if (cargue != null && !cargue.isEmpty()) {
							Iterator<CargueVO> it = cargue.iterator();
							while (it.hasNext()) {
								CargueVO vo = it.next();
								if (!(vo.getVflcodigo().equals(
										CargueService.BENEFICIOS_EMP) || vo
										.getVflcodigo().equals(
												CargueService.EMPRESAS_EMP))) {
									it.remove();
								}
							}
						}
					} catch (Exception e) {
						SUBException.logDebugError("", e);
					}

					if (cargue != null) {
						if (cargue.size() > 0) {
							formBean.setCargue(cargue);
						} else {
							formBean.setMsg(SIN_REGISTROS);
						}
					}
				}
			}

			if (operacion != null) {
				if (operacion.equals(Utility.OP_BUSCAR)) {
					// if (search != null) {
					objcargueVO.setCode(lote);
					objcargueVO.setNombre(nombreCargue.trim());
					objcargueVO.setFechaInicial(fechaInicial);
					objcargueVO.setFechaFinal(fechaFinal);

					try {
						cargue = cargueServiceImpl
								.findArchivoCargueByCriteria(objcargueVO);
						if (cargue != null && !cargue.isEmpty()) {
							Iterator<CargueVO> it = cargue.iterator();
							while (it.hasNext()) {
								CargueVO vo = it.next();
								if (!(vo.getVflcodigo().equals(
										CargueService.BENEFICIOS_EMP) || vo
										.getVflcodigo().equals(
												CargueService.EMPRESAS_EMP))) {
									it.remove();
								}
							}
						}
					} catch (Exception e) {
						SUBException.logDebugError("", e);
					}

					if (cargue != null) {
						if (cargue.size() > 0) {
							formBean.setCargue(cargue);
						} else {
							formBean.setMsg(SIN_REGISTROS);
						}
					}
					// }
				} else if (operacion.equals(Utility.OP_VALIDAR)) {

					try {
						String codigoLote = formBean.getValidar().trim();

						String tipoCargue = formBean.getTipoCargue();
						boolean mover = cargueServiceImpl.moveToCargarDatos(
								Integer.parseInt(codigoLote), tipoCargue, user
										.getName(), terminalAddress, user
										.getUserGroupName(), user.getCode()
										.toString());
						if (mover) {
							request.setAttribute(
									"msg",
									"El archivo fue cargado, para ver los registros no procesados haga clic en Regs. No procesados ");
						} else {
							request.setAttribute("msg",
									"El archivo no ha sido cargado aun, por favor hacer clic en cargar.");
						}
						String validar = request.getParameter("validar");
						if ((Object) validar != null
								&& !validar.equalsIgnoreCase("")) {
							objcargueVO.setCode(validar);
							try {
								cargue = cargueServiceImpl
										.findArchivoCargueByCriteria(objcargueVO);
								if (cargue != null && !cargue.isEmpty()) {
									Iterator<CargueVO> it = cargue.iterator();
									while (it.hasNext()) {
										CargueVO vo = it.next();
										if (!(vo.getVflcodigo().equals(
												CargueService.BENEFICIOS_EMP) || vo
												.getVflcodigo()
												.equals(CargueService.EMPRESAS_EMP))) {
											it.remove();
										}
									}
								}
							} catch (Exception e) {
								SUBException.logDebugError("", e);
							}

							if (cargue != null) {
								if (cargue.size() > 0) {
									formBean.setCargue(cargue);
								} else {
									formBean.setMsg(SIN_REGISTROS);
								}
							}
						}
					} catch (Exception e) {
						formBean.setMsg("Error de sql al validar el archivo");
						SUBException.logDebugError("", e);
					}
				}
			}
		} catch (UserException ue) {
			messages.add("msgWarn", new ActionMessage("loginForm.message."
					+ ue.getExceptionVO().getId()));
			saveMessages(request, messages);
			if (ue.getExceptionVO().getId() == AdministrationUserException.ENDED_SESSION) {
				response.sendRedirect(request.getContextPath() + "/index.jsp");
			} else if (ue.getExceptionVO().getId() == CommonUserException.NOT_ALLOWED_RESOURCE) {
				response.sendRedirect(request.getContextPath()
						+ "/admin/tile/invalidatedResource.jsp");
			} else {
				return mapping.getInputForward();
			}
		}

		return mapping.findForward("success");
	}
}
